查看原文
其他

分布式存储系统的一致性-可见性差异

编程一生 编程一生 2022-11-10


引子

上高中的时候,每次物理老师开始讲:世界是由物质构成的。物质存在三种基本的物理状态:固态、液态、气态。我脑子里就开始列举这个公理不能解释的现象:各种波:光波、声波属于那种物理状态?情感、情绪属于哪种物质呢?
那时候我就创造了一套自己的理论。这么多年过去,我发现这套理论可以解释所有的事情。
物质分为两种:波和传播波的介质。介质存在四种基本的物理状态:固态、液态、气态和真空。介质是波的载体,能够传导波。情感和光波、声波一样,都是一种波。真空是一种物理状态。为什么放在真空的东西会维持原来的质量、速度,而不是消失呢?我的解释是它是一种介质,可以维持物质的这些属性。
所以我的基本世界公理是这样的:

因为这套公理在我的世界里运行的很好,甚至可以解释灵魂、魔法、唯物主义和唯心主义。所以我一直沿用这套公理,把它作为基本的世界模型。有时候,像这样一些自建公理,当自己一直在自己现有的圈子里时会运行的很好,一旦跳出这个圈子,会有一个凌乱期,叫做:「颠覆了我对世界的认知」。面对这个困境。「奇异博士」里提供了一个很好的解决方案:「forget everything you think you know」


在大多数情况下,一个基本可用的系统中,将数据更新到数据库,并且数据库返回操作成功。意味着马上能看到最新的数据。但是有时候情况却是:在一小段时间内一会儿是新数据,一会儿是旧数据。这时候,脑子请浮现一句话:「forget everything you think you know」



是什么

为了提高系统的容灾能力、提高性能、容量、扩展性等原因。在对数据库并发要求高的场景,经常将数据可见性分为实时可见、准实时可见、延迟可见。
在有主从同步或者读写分离的场景中,需要实时查询的数据会直接走主库,准实时就是可以走从库。延迟可见常用的比如给数据库建立一个异构数据库,按照一定策略进行数据同步。

    

为什么

Mysql

主流的关系型数据库,以mysql为例。默认情况下,复制功能是异步的,因为这样可以提供最佳的性能。所谓异步复制,就是主库把binlog发送给从库,这一动作就结束了。并不验证从库是否接收完毕。
异步方式在发生故障时会造成数据不能最终一致。这时可开启半同步复制模式。这种方式是在主服务器接收完服务器发送的binlog并写到自己的中继relay log里,给主服务端一个反馈,才算一个操作完毕。
无论是异步复制还是半同步复制,都不可避免的会引入主从延迟。主从延迟的时间差就会造成数据的可见性问题。
mysql是强一致性数据库,是稳定而宝贵的资源。对于大查询,比如:查询数据历史、批量查询等。这种场景下,对数据的可见性延迟要求不高,可以采用Elasticsearch等其他的更低价的nosql数据库来完成。算是一种异构数据库。这个同步过程,涉及到数据抽取、转换等过程。延迟一般要大于读从库。这就是一个可见性时间差。

Elasticsearch

Elasticsearch内部有副本机制,类似于mysql的从库。主分片和副本之间的同步也有个可见性时间差。

怎么做

从库和副本数量多,所需要的同步时间也长。减少从库和副本的数量,可缩短可见性时间差。但是如果对可见性时间差是零容忍的。就需要设置为只读主的方式。在mysql中,可以设置路由类型为master-only。在Elasticsearch中,可以设置search preference。具体文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_search_options.html。

    

总结

如果整篇文章你只能记住一件事,那么请记住:如果一件事情颠覆了你的认知,那么请忘记自己知道的重新开始。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存